package com.ruoyi.system.service;

import java.text.SimpleDateFormat;
import java.util.*;

import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.system.domain.MealOrder;
import com.ruoyi.system.domain.MealOrderExportVO;
import com.ruoyi.system.domain.MealOrderTable;
import com.ruoyi.system.domain.MealOrderVO;
import com.ruoyi.system.domain.dto.MyOrdersDTO;
import com.ruoyi.system.domain.dto.UnfilledMealOrderDTO;
import com.ruoyi.system.domain.vo.MealStatisticsBO;

import java.util.List;
import java.util.Map;

/**
 * 订餐管理Service接口
 * 
 * @author ruoyi
 * @date 2025-08-15
 */
public interface IMealOrderService 
{
    /**
     * 查询订餐管理
     * 
     * @param id 订餐管理主键
     * @return 订餐管理
     */
    public MealOrder selectMealOrderById(Long id);

    /**
     * 查询订餐管理列表
     * 
     * @param mealOrder 订餐管理
     * @return 订餐管理集合
     */
    public List<MealOrder> selectMealOrderList(MealOrder mealOrder);

    /**
     * 新增订餐管理
     * 
     * @param mealOrder 订餐管理
     * @return 结果
     */
    public int insertMealOrder(MealOrder mealOrder);

    /**
     * 修改订餐管理
     * 
     * @param mealOrder 订餐管理
     * @return 结果
     */
    public int updateMealOrder(MealOrder mealOrder);
    public int updateOrder(MealOrder mealOrder);

    /**
     * 批量删除订餐管理
     * 
     * @param ids 需要删除的订餐管理主键集合
     * @return 结果
     */
    public int deleteMealOrderByIds(Long[] ids);

    /**
     * 删除订餐管理信息
     * 
     * @param id 订餐管理主键
     * @return 结果
     */
    public int deleteMealOrderById(Long id);

    /**
     * 查询培训订餐人数
     *
     * @param year 年
     * @param month 月
     * @param day 日
     * @param mealType 订餐类型
     * @return 培训订餐人数
     */
    public List<MealStatisticsBO> getMealStatistics(Integer year, Integer month, Integer day, String mealType);
    /**
     * 导入订餐数据
     *
     * @param mealOrderList 订餐数据列表
     * @param updateSupport 是否更新已存在的数据
     * @param operName 操作用户
     * @return 结果
     */
    public String importMealOrder(List<MealOrder> mealOrderList, boolean updateSupport, String operName);


    /**
     * 查询订餐管理VO列表
     *
     * @param mealOrderVO 订餐管理VO
     * @return 订餐管理VO集合
     */
    public List<MealOrderVO> selectMealOrderVOList(MealOrderVO mealOrderVO);

    /**
     * 获取单次培训午、晚餐订餐情况
     *
     * @param trainingName 培训名称
     * @return 培训订餐列表
     */
    public AjaxResult getTrainingOrder(String trainingName);
    /**
     * 获取导出数据（转换为 VO 列表）
     */
    List<MealOrderExportVO> exportData();
    /**
     * 根据查询条件获取导出数据
     *
     * @param mealOrderVO 查询条件
     * @return 导出数据列表
     */
    List<MealOrderExportVO> selectMealOrderExportVOList(MealOrderVO mealOrderVO);

    /**
     * 按培训分组获取导出数据
     *
     * @param mealOrderVO 查询条件
     * @return 按培训分组的导出数据
     */
    Map<String, List<MealOrderExportVO>> selectGroupedExportData(MealOrderVO mealOrderVO);
    /**
     * 根据员工ID和培训ID删除订餐详情
     *
     * @param empId 员工ID
     * @param trainingId 培训ID
     * @return 结果
     */
    public int deleteMealDetailsByEmpIdAndTrainingId(Long empId, Long trainingId);

    /**
     * 根据员工ID和培训ID查询订餐记录
     *
     * @param empId 员工ID
     * @param trainingId 培训ID
     * @return 订餐记录列表
     */
    public List<MealOrderVO> selectByEmpAndTraining(Long empId, Long trainingId);

    public MealOrder findTargetOrder(List<MealOrder> list, String currentDate, String mealType, SimpleDateFormat sdf);

    public String getCurrentMealType(Date now);
    /**
     * 查询未填写订餐信息的记录
     * @return 未填写订餐信息列表
     */
    public List<UnfilledMealOrderDTO> getUnfilledMealOrders(Long empId);
    /**
     * 根据员工ID获取订餐记录
     *
     * @param empId 员工ID
     * @return 订餐记录列表
     */
    public MyOrdersDTO getMyOrders(Long empId);

    /**
     * 修改订餐状态
     *
     * @param id 订餐ID
     * @param status 订餐状态
     */
    public int alterMealOrderStatus(Long id, Integer status);

    /**
     * 导入订餐数据表
     *
     * @param orderList 订餐数据列表
     * @param trainingName 培训名称
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @param updateSupport 是否更新已存在数据
     */
    public AjaxResult importMealOrderTable(List<MealOrderTable> orderList, String trainingName, String startDate, String endDate, boolean updateSupport);
}

